package main

import (
	"fmt"
	"sync"
	"time"
)

// 非阻塞获取锁，获取不到就直接放弃，这时候可以使用Mutex的TryLock：
func main() {
	var mu sync.Mutex
	var wg sync.WaitGroup

	// 定义一个尝试获取锁并执行任务的函数
	tryTask := func(id int) {
		defer wg.Done()
		fmt.Printf("Goroutine %d: 尝试获取锁...\n", id)

		// 尝试非阻塞地获取锁
		if mu.TryLock() {
			// 成功获取到锁
			fmt.Printf("Goroutine %d: 成功获取锁，开始执行任务...\n", id)
			time.Sleep(2 * time.Second) // 模拟任务执行
			fmt.Printf("Goroutine %d: 任务执行完毕，释放锁。\n", id)
			mu.Unlock() // 释放锁
		} else {
			// 未能获取到锁
			fmt.Printf("Goroutine %d: 获取锁失败，任务被跳过。\n", id)
		}
	}

	wg.Add(2)
	go tryTask(1)
	go tryTask(2)

	wg.Wait()
	fmt.Println("所有任务处理完毕。")
}
